// 字符串会重复 产生冲突
// share.js --------------------------------------------------
const cache = {}
// a.js ------------------------------------------------------
cache['foo'] = Math.random()
// b.js ------------------------------------------------------
cache['foo'] = '123'
console.log(cache)
// { foo: '123' } 前面的被后面的覆盖了!
// 拓展第三方模块时候不知道该对象是否有某一个指定的键 冒然扩展产生冲突
// 约定a_foo/b_foo 规避问题
const s = Symbol('234')
console.log(s)
// Symbol()
console.log(typeof s)
// symbol
console.log(Symbol() === Symbol())
// false
// 对象名可以是string'或者symbol
// 使用symbol作为键添加成员
// c.js ------------------------------------------------------
cache[s] = '345'
// d.js ------------------------------------------------------
cache[s] = '456'
// s===s 必须恒等所以覆盖
console.log(cache)
// { foo: '123', [Symbol()]: '456' }
cache[Symbol('678')] = '678'
cache[Symbol('789')] = '789'
console.log(cache)
// {
//     foo: '123',
//     [Symbol(456)]: '456',
//     [Symbol(678)]: '678',
//     [Symbol(789)]: '789'
//   }
// 直接使用可以 s=Symbol('456')就失去这个特性了, 重名了
// Symbol()的值是惟一的
// 可以传入字符串作为文本用来区分
// 计算属性名
const obj = {
  [Symbol('369')]: '369'
}
// 模拟实现对象的私有成员
// 约定_开头就是私有成员
// a.js ------------------------------------------------------
const name = Symbol()
const person = {
  [name]: 'zs',
  [name]: 'lx',
  say() {
    console.log(this[name])
  }
}
// b.js ------------------------------------------------------
// console.log(person[[name]]);
// // TypeError: Cannot convert a Symbol value to a string
person.say()
// lx
// 7种数据类型 未来BigInt 8种数据类型
